/**
 *
 * 1:抽象类不能被实例化,只能被继承
 * 2: 抽象类中不能有具体的方法，只能有`抽象方法`
 * @abstract
 * @class Animal
 */
abstract class Animal {
  name: string;
  // constructor (name?:string) {
  //   this.name = 'name'
  // }
  abstract getName(): string;
}
class Cat extends Animal {
  getName(): string {
    return this.name;
  }


}
let cat = new Cat()
cat.name = 'leichao'
// console.log(cat.getName())
/**
 *接口是用来描述行为的抽象,接口里面不能放实现，只能是定义，所有的方法都是抽象的
 */
interface Speakable{
 speak():void;
}
interface Eatable{
  eat():void;
}
// 类可以实现多个接口，但是只能继承一个父类
class Person extends Animal implements Eatable,Speakable {
  eat(): void {
    throw new Error("Method not implemented.");
  }
  speak(): void {
    throw new Error("Method not implemented.");
  }
  // 
  getName(): string {
    throw new Error("Method not implemented.");
  }

}
namespace a {
  // 重写 子类重新实现并覆盖父类中的方法
  class Animal {

  }
}